/**
 * 
 */
package co.com.siti.sie.managedbean.view;

import java.io.Serializable;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFRichTextString;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Font;
import org.primefaces.event.CellEditEvent;
import org.primefaces.model.UploadedFile;

import co.com.siti.sie.managedbean.data.TrasladosDataManagedBean;
import co.com.siti.sie.vo.AlumnoVO;
import co.com.siti.sie.vo.AsignaturaVO;
import co.com.siti.sie.vo.GrupoVO;

/**
 * Clase contenedora de la lógica de la vista de traslados
 * 
 * @author David.Cadena
 *
 */
@ManagedBean(name = "notasview")
@ViewScoped
public class NotasManagedBean implements Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	private Integer codProfesor;
	private String numdocProfesor;
	private String nombreProfesor;

	private List<GrupoVO> gruposEncontrados;
	private String grupoSeleccionado;
	private String asignaturaSeleccionada;
	private Map<String, GrupoVO> mapaGrupos;
	private Map<String, AsignaturaVO> mapaAsignaturas;
	private GrupoVO grupoModificar;
	private AsignaturaVO asignaturaModificar;
	private List<AsignaturaVO> asignaturasEncontradas;
	private UploadedFile archivoCarga;

	/**
   * 
   */
	public NotasManagedBean() {
		cargarDocente();
		cargarGrupos();
	}

	private void cargarGrupos() {
		mapaGrupos = new HashMap<String, GrupoVO>();
		gruposEncontrados = TrasladosDataManagedBean
				.getGruposNotasProsefor(numdocProfesor);
		if (gruposEncontrados != null && !gruposEncontrados.isEmpty()) {
			for (GrupoVO grupoVO : gruposEncontrados) {
				if (!mapaGrupos.containsKey(grupoVO.getCodigo().toString())) {
					mapaGrupos.put(grupoVO.getCodigo().toString(), grupoVO);
				}
			}
		}
	}

	/**
   * 
   */
	private void cargarDocente() {
		codProfesor = 16;
		numdocProfesor = "23897994";
		nombreProfesor = "CECILIA MARGARITA GIRALDO DUQUE";
	}

	public void postProcessXLS(Object document) {

		System.out.println("document: " + document);
		System.out.println("grupo modificar: "
				+ grupoModificar.getDescripcion() + ", asignaturas: "
				+ grupoModificar.getAsignaturas().size());

		HSSFWorkbook wb = (HSSFWorkbook) document;

		HSSFCellStyle headerStyle = wb.createCellStyle();
		headerStyle.setFillForegroundColor(HSSFColor.BLACK.index);
		headerStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
		Font headerFont = wb.createFont();
		headerFont.setColor(HSSFColor.WHITE.index);
		headerFont.setBoldweight(Font.BOLDWEIGHT_BOLD);
		headerStyle.setFont(headerFont);
		headerStyle.setAlignment(CellStyle.ALIGN_CENTER);

		HSSFCellStyle defaultStyle = wb.createCellStyle();
		defaultStyle.setFillForegroundColor(HSSFColor.WHITE.index);
		defaultStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
		Font defaultFont = wb.createFont();
		defaultFont.setColor(HSSFColor.BLACK.index);
		defaultFont.setBoldweight(Font.BOLDWEIGHT_BOLD);
		defaultStyle.setFont(defaultFont);
		defaultStyle.setAlignment(CellStyle.ALIGN_CENTER);

		HSSFCellStyle notasStyle = wb.createCellStyle();
		notasStyle.setFillForegroundColor(HSSFColor.WHITE.index);
		notasStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
		Font notasFont = wb.createFont();
		notasFont.setColor(HSSFColor.BLACK.index);
		notasStyle.setFont(notasFont);
		notasStyle.setAlignment(CellStyle.ALIGN_CENTER);

		int columna = 0;
		int fila = 0;

		HSSFSheet hojaUnica = wb.createSheet(grupoModificar.getDescripcion());

		HSSFRow header = hojaUnica.createRow(0);
		header.setHeightInPoints(4 * 10);

		HSSFRow subHeader = hojaUnica.createRow(1);
		subHeader.setHeightInPoints(2 * 10);

		for (AsignaturaVO asignatura : grupoModificar.getAsignaturas()) {

			System.out.println("columna: " + fila + " - fila: " + columna);

			HSSFCell headerCell = header.createCell(columna);
			headerCell.setCellValue(new HSSFRichTextString(asignatura
					.getNombre().toUpperCase()));
			headerCell.setCellStyle(headerStyle);

			HSSFCell subheaderAlumno = subHeader.createCell(columna);
			subheaderAlumno.setCellValue(new HSSFRichTextString("ALUMNO"));
			subheaderAlumno.setCellStyle(defaultStyle);
			hojaUnica.autoSizeColumn(subheaderAlumno.getCellNum());

			HSSFCell subheaderNotas = subHeader.createCell(columna + 1);
			subheaderNotas.setCellValue(new HSSFRichTextString("NOTA"));
			subheaderNotas.setCellStyle(defaultStyle);
			hojaUnica.autoSizeColumn(subheaderNotas.getCellNum());

			int aux = 2;

			for (AlumnoVO alumno : asignatura.getAlumnos()) {

				HSSFRow alumnoRow;
				HSSFRow notaRow;

				if (hojaUnica.getRow(aux) != null) {
					alumnoRow = hojaUnica.getRow(aux);
					notaRow = hojaUnica.getRow(aux);
				} else {
					alumnoRow = hojaUnica.createRow(aux);
					notaRow = hojaUnica.createRow(aux);
				}

				HSSFCell nombreAlumno = alumnoRow.createCell(fila);
				nombreAlumno.setCellValue(new HSSFRichTextString(alumno
						.getIdentificacion() + " - " + alumno.getNombre()));
				hojaUnica.autoSizeColumn(nombreAlumno.getCellNum());

				HSSFCell notaAlumno = notaRow.createCell(fila + 1);
				notaAlumno.setCellValue(new HSSFRichTextString(alumno
						.getCalificacion() == null ? "-" : alumno
						.getCalificacion().toString()));
				notaAlumno.setCellStyle(notasStyle);
				hojaUnica.autoSizeColumn(notaAlumno.getCellNum());

				aux++;
			}

			fila = fila + 2;

			columna = columna + 2;

		}

	}

	public void postProcessXLSLista(Object document) {

		System.out.println("document: " + document);
		System.out.println("grupo modificar: "
				+ grupoModificar.getDescripcion() + ", asignaturas: "
				+ grupoModificar.getAsignaturas().size());

		HSSFWorkbook wb = (HSSFWorkbook) document;

		HSSFCellStyle headerStyle = wb.createCellStyle();
		headerStyle.setFillForegroundColor(HSSFColor.BLACK.index);
		headerStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
		Font headerFont = wb.createFont();
		headerFont.setColor(HSSFColor.WHITE.index);
		headerFont.setBoldweight(Font.BOLDWEIGHT_BOLD);
		headerStyle.setFont(headerFont);
		headerStyle.setAlignment(CellStyle.ALIGN_CENTER);

		HSSFCellStyle defaultStyle = wb.createCellStyle();
		defaultStyle.setFillForegroundColor(HSSFColor.WHITE.index);
		defaultStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
		Font defaultFont = wb.createFont();
		defaultFont.setColor(HSSFColor.BLACK.index);
		defaultFont.setBoldweight(Font.BOLDWEIGHT_BOLD);
		defaultStyle.setFont(defaultFont);
		defaultStyle.setAlignment(CellStyle.ALIGN_CENTER);

		HSSFCellStyle notasStyle = wb.createCellStyle();
		notasStyle.setFillForegroundColor(HSSFColor.WHITE.index);
		notasStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
		Font notasFont = wb.createFont();
		notasFont.setColor(HSSFColor.BLACK.index);
		notasStyle.setFont(notasFont);
		notasStyle.setAlignment(CellStyle.ALIGN_CENTER);

		int columna = 0;
		int fila = 0;

		HSSFSheet hojaUnica = wb.createSheet(grupoModificar.getDescripcion());

		HSSFRow header = hojaUnica.createRow(0);
		header.setHeightInPoints(4 * 10);

		int aux = 1;

		for (AlumnoVO alumno : grupoModificar.getAsignaturas().get(1)
				.getAlumnos()) {

			HSSFRow alumnoRow;
			if (hojaUnica.getRow(aux) != null) {
				alumnoRow = hojaUnica.getRow(aux);
				hojaUnica.getRow(aux);
			} else {
				alumnoRow = hojaUnica.createRow(aux);
				hojaUnica.createRow(aux);
			}

			HSSFCell nombreAlumno = alumnoRow.createCell(fila);
			nombreAlumno.setCellValue(new HSSFRichTextString(alumno
					.getIdentificacion() + " - " + alumno.getNombre()));
			hojaUnica.autoSizeColumn(nombreAlumno.getCellNum());

			aux++;
		}

		HSSFCell subheaderAlumno = header.createCell(columna);
		subheaderAlumno.setCellValue(new HSSFRichTextString("ALUMNO"));
		subheaderAlumno.setCellStyle(defaultStyle);

		for (AsignaturaVO asignatura : grupoModificar.getAsignaturas()) {

			System.out.println("columna: " + fila + " - fila: " + columna);

			HSSFCell headerCell = header.createCell(columna + 1);
			headerCell.setCellValue(new HSSFRichTextString(asignatura
					.getNombre().toUpperCase()));
			headerCell.setCellStyle(headerStyle);

			hojaUnica.autoSizeColumn(headerCell.getCellNum());

			fila = fila + 1;

			columna = columna + 1;

		}

	}

	public void seleccionarGrupo() {
		limpiarAsignatura();
		System.out.println("Grupo seleccionado: " + grupoSeleccionado);

		if (grupoSeleccionado != null && !grupoSeleccionado.isEmpty()) {
			grupoModificar = mapaGrupos.get(grupoSeleccionado);
			mapaAsignaturas = new HashMap<String, AsignaturaVO>();
			for (AsignaturaVO asignatura : grupoModificar.getAsignaturas()) {
				mapaAsignaturas.put(asignatura.getCodigo().toString(),
						asignatura);
			}
			asignaturasEncontradas = grupoModificar.getAsignaturas();
		}

	}

	private void limpiarAsignatura() {
		asignaturasEncontradas = null;
		asignaturaSeleccionada = null;
	}

	public void seleccionarAsignatura() {
		System.out
				.println("Asignatura seleccionada: " + asignaturaSeleccionada);
		asignaturaModificar = mapaAsignaturas.get(asignaturaSeleccionada);

	}

	public void onCellEdit(CellEditEvent event) {
		Object notaVieja = event.getOldValue();
		Object notaNueva = event.getNewValue();

		AlumnoVO alumno = asignaturaModificar.getAlumnos().get(
				event.getRowIndex());
		System.out.println("alumno a editar nota: " + alumno.getNombre());

		if (notaNueva != null && !notaNueva.equals(notaVieja)) {
			System.out.println("nota anterior: " + notaVieja + ", nota nueva:"
					+ notaNueva);
			if (alumno.getIdEvaluacion() == null) {
				// se debe crear el registro en la tabla tblciclogradoasignatura
				// y tblevaluacionasignatura
				TrasladosDataManagedBean.crearCicloGradoAsignatura(
						grupoModificar, asignaturaModificar, alumno,
						(Double) notaNueva, nombreProfesor, codProfesor);
			} else {
				// se actualiza el registro en la tabla tblevaluacionasignatura
				System.out.println("registro a actualizar: "
						+ alumno.getIdEvaluacion());
				TrasladosDataManagedBean.actualizarCalificacion(
						alumno.getIdEvaluacion(), (Double) notaNueva);
			}
		}
	}

	/**
	 * @return the numdocProfesor
	 */
	public String getNumdocProfesor() {
		return numdocProfesor;
	}

	/**
	 * @param numdocProfesor
	 *            the numdocProfesor to set
	 */
	public void setNumdocProfesor(String numdocProfesor) {
		this.numdocProfesor = numdocProfesor;
	}

	/**
	 * @return the nombreProfesor
	 */
	public String getNombreProfesor() {
		return nombreProfesor;
	}

	/**
	 * @param nombreProfesor
	 *            the nombreProfesor to set
	 */
	public void setNombreProfesor(String nombreProfesor) {
		this.nombreProfesor = nombreProfesor;
	}

	/**
	 * @return the gruposEncontrados
	 */
	public List<GrupoVO> getGruposEncontrados() {
		return gruposEncontrados;
	}

	/**
	 * @param gruposEncontrados
	 *            the gruposEncontrados to set
	 */
	public void setGruposEncontrados(List<GrupoVO> gruposEncontrados) {
		this.gruposEncontrados = gruposEncontrados;
	}

	/**
	 * @return the grupoSeleccionado
	 */
	public String getGrupoSeleccionado() {
		return grupoSeleccionado;
	}

	/**
	 * @param grupoSeleccionado
	 *            the grupoSeleccionado to set
	 */
	public void setGrupoSeleccionado(String grupoSeleccionado) {
		this.grupoSeleccionado = grupoSeleccionado;
	}

	/**
	 * @return the asignaGrupos
	 */
	public Map<String, GrupoVO> getAsignaGrupos() {
		return mapaGrupos;
	}

	/**
	 * @param asignaGrupos
	 *            the asignaGrupos to set
	 */
	public void setAsignaGrupos(Map<String, GrupoVO> asignaGrupos) {
		this.mapaGrupos = asignaGrupos;
	}

	/**
	 * @return the grupoModificar
	 */
	public GrupoVO getGrupoModificar() {
		return grupoModificar;
	}

	/**
	 * @param grupoModificar
	 *            the grupoModificar to set
	 */
	public void setGrupoModificar(GrupoVO grupoModificar) {
		this.grupoModificar = grupoModificar;
	}

	/**
	 * @return the archivoCarga
	 */
	public UploadedFile getArchivoCarga() {
		return archivoCarga;
	}

	/**
	 * @param archivoCarga
	 *            the archivoCarga to set
	 */
	public void setArchivoCarga(UploadedFile archivoCarga) {
		this.archivoCarga = archivoCarga;
	}

	/**
	 * @return the asignaturaSeleccionada
	 */
	public String getAsignaturaSeleccionada() {
		return asignaturaSeleccionada;
	}

	/**
	 * @param asignaturaSeleccionada
	 *            the asignaturaSeleccionada to set
	 */
	public void setAsignaturaSeleccionada(String asignaturaSeleccionada) {
		this.asignaturaSeleccionada = asignaturaSeleccionada;
	}

	/**
	 * @return the asignaturaModificar
	 */
	public AsignaturaVO getAsignaturaModificar() {
		return asignaturaModificar;
	}

	/**
	 * @param asignaturaModificar
	 *            the asignaturaModificar to set
	 */
	public void setAsignaturaModificar(AsignaturaVO asignaturaModificar) {
		this.asignaturaModificar = asignaturaModificar;
	}

	/**
	 * @return the asignaturasEncontradas
	 */
	public List<AsignaturaVO> getAsignaturasEncontradas() {
		return asignaturasEncontradas;
	}

	/**
	 * @param asignaturasEncontradas
	 *            the asignaturasEncontradas to set
	 */
	public void setAsignaturasEncontradas(
			List<AsignaturaVO> asignaturasEncontradas) {
		this.asignaturasEncontradas = asignaturasEncontradas;
	}

	/**
	 * @return the codProfesor
	 */
	public Integer getCodProfesor() {
		return codProfesor;
	}

	/**
	 * @param codProfesor
	 *            the codProfesor to set
	 */
	public void setCodProfesor(Integer codProfesor) {
		this.codProfesor = codProfesor;
	}

}
